package com.lam.code.configuration.datasource;

import lombok.extern.slf4j.Slf4j;

import java.util.HashSet;
import java.util.Set;

/**
 * @author lam
 * @description 数据源切换处理
 * @date 2019/11/5 22:59
 */
@Slf4j
public class DynamicDataSourceContextHolder {
    /**
     * 存在的数据源Key
     */
    private final static Set<String> existDsKeys = new HashSet<>();

    public static void addExistDsKey(String dsKey){
        existDsKeys.add(dsKey);
    }

    /**
     * 使用ThreadLocal维护变量，ThreadLocal为每个使用该变量的线程提供独立的变量副本，
     * 所以每一个线程都可以独立地改变自己的副本，而不会影响其它线程所对应的副本。
     */
    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
    /**
     * 设置数据源的变量
     */
    public static void setDataSourceType(String dsType) {
        if (existDsKeys.contains(dsType)){
            log.info("切换到{}数据源", dsType);
            CONTEXT_HOLDER.set(dsType);
        }else {
            log.info("数据源{}未启用，将使用默认数据源",dsType);
        }
    }

    /**
     * 获得数据源的变量
     */
    public static String getDataSourceType() {
        return CONTEXT_HOLDER.get();
    }

    /**
     * 清空数据源变量
     */
    public static void clearDataSourceType() {
        CONTEXT_HOLDER.remove();
    }

}
